package cn.bonoon.kernel.menus.privileges;

import java.util.List;

import cn.bonoon.kernel.menus.ChannelDefinition;
import cn.bonoon.kernel.menus.MenuDefinition;
import cn.bonoon.kernel.menus.MenuableDefinition;
import cn.bonoon.kernel.menus.TabItemDefinition;
import cn.bonoon.kernel.menus.TabsDefinition;

/**
 * <pre>
 * 系统访问操作的权限的控制
 * 
 * 从数据库加载，指向当前的功能，应该包括：
 * 当前功能子系统的ID
 * 当前功能的频道的ID
 * 当前功能的ID
 * 该子系统可以访问的频道的ID
 * 该频道下可以访问的菜单的ID
 * 该功能下可以操作的事件的ID（按钮的key）
 * 
 * 可以直接从数据库加载
 * </pre>
 * @author jackson
 *
 */
public class MyPrivilegeInspector implements PrivilegeInspector{
	private final String moduleId;
	private final String channelId;
	private final String currentItemId;
	
	private final List<String> channels; // 应该是一个子系统下的所有有操作权限的频道
	private final List<String> menus; // 应该是一个子系统下的所有有操作权限的菜单
//	private final List<String> keys;
	
	public MyPrivilegeInspector(String moduleId, String channelId, String currentItemId, List<String> channels, List<String> menus){
		this.channels = channels;
		this.menus = menus;
		this.moduleId = moduleId;
		this.channelId = channelId;
		this.currentItemId = currentItemId;
	}
	
	public boolean hasPrivilege(ChannelDefinition channel) {
		return channels.contains(channel.getId());
	}

	public boolean hasPrivilege(MenuDefinition menu) {
		return menus.contains(menu.getId());
	}

	public boolean hasPrivilege(MenuableDefinition item) {
		return currentItemId.equals(item.getId());
	}

	@Override
	public boolean hasPrivilege(TabsDefinition tsi) {
		//tabs里只要有一个tab有权限，则应该显示该菜单
		for(TabItemDefinition ti : tsi){
			if(menus.contains(ti.getId())){ return true; }
		}
		return false;
	}

	@Override
	public boolean hasPrivilege(TabItemDefinition item) {
		return menus.contains(item.getId());
	}

	public String getModuleId() {
		return moduleId;
	}

	public String getChannelId() {
		return channelId;
	}
	
}
